home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / rogue / inventor.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-05-13  |  8.4 KB  |  458 lines

  1. /*
  2.  * inventory.c
  3.  *
  4.  * This source herein may be modified and/or distributed by anybody who
  5.  * so desires, with the following restrictions:
  6.  *    1.)  No portion of this notice shall be removed.
  7.  *    2.)  Credit shall not be taken for the creation of this source.
  8.  *    3.)  This code is not to be traded, sold, or used for personal
  9.  *         gain or profit.
  10.  *
  11.  */
  12.  
  13. #ifndef CURSES
  14. #include <curses.h>
  15. #endif CURSES
  16. #include "rogue.h"
  17.  
  18. #define swap_string(x,y) {t = x; x = y; y = t;}
  19.  
  20. boolean is_wood[WANDS];
  21.  
  22. char *wand_materials[WAND_MATERIALS] = {
  23.     "steel ",
  24.     "bronze ",
  25.     "gold ",
  26.     "silver ",
  27.     "copper ",
  28.     "nickel ",
  29.     "cobalt ",
  30.     "tin ",
  31.     "iron ",
  32.     "magnesium ",
  33.     "chrome ",
  34.     "carbon ",
  35.     "platinum ",
  36.     "silicon ",
  37.     "titanium ",
  38.  
  39.     "teak ",
  40.     "oak ",
  41.     "cherry ",
  42.     "birch ",
  43.     "pine ",
  44.     "cedar ",
  45.     "redwood ",
  46.     "balsa ",
  47.     "ivory ",
  48.     "walnut ",
  49.     "maple ",
  50.     "mahogany ",
  51.     "elm ",
  52.     "palm ",
  53.     "wooden "
  54. };
  55.  
  56. char *gems[GEMS] = {
  57.     "diamond ",
  58.     "stibotantalite ",
  59.     "lapi-lazuli ",
  60.     "ruby ",
  61.     "emerald ",
  62.     "sapphire ",
  63.     "amethyst ",
  64.     "quartz ",
  65.     "tiger-eye ",
  66.     "opal ",
  67.     "agate ",
  68.     "turquoise ",
  69.     "pearl ",
  70.     "garnet "
  71. };
  72.  
  73. char *syllables[MAXSYLLABLES] = {
  74.     "blech ",
  75.     "foo ",
  76.     "barf ",
  77.     "rech ",
  78.     "bar ",
  79.     "blech ",
  80.     "quo ",
  81.     "bloto ",
  82.     "woh ",
  83.     "caca ",
  84.     "blorp ",
  85.     "erp ",
  86.     "festr ",
  87.     "rot ",
  88.     "slie ",
  89.     "snorf ",
  90.     "iky ",
  91.     "yuky ",
  92.     "ooze ",
  93.     "ah ",
  94.     "bahl ",
  95.     "zep ",
  96.     "druhl ",
  97.     "flem ",
  98.     "behil ",
  99.     "arek ",
  100.     "mep ",
  101.     "zihr ",
  102.     "grit ",
  103.     "kona ",
  104.     "kini ",
  105.     "ichi ",
  106.     "niah ",
  107.     "ogr ",
  108.     "ooh ",
  109.     "ighr ",
  110.     "coph ",
  111.     "swerr ",
  112.     "mihln ",
  113.     "poxi "
  114. };
  115.  
  116. extern boolean wizard;
  117.  
  118. inventory(pack, mask)
  119. object *pack;
  120. unsigned short mask;
  121. {
  122.     object *obj;
  123.     short i = 0, j, maxlen = 0, n;
  124.     char descs[MAX_PACK_COUNT+1][DCOLS];
  125.     short row, col;
  126.  
  127.     obj = pack->next_object;
  128.  
  129.     if (!obj) {
  130.         message("your pack is empty", 0);
  131.         return;
  132.     }
  133.     while (obj) {
  134.         if (obj->what_is & mask) {
  135.             descs[i][0] = ' ';
  136.             descs[i][1] = obj->ichar;
  137.             descs[i][2] = ((obj->what_is & ARMOR) && obj->is_protected)
  138.                 ? '}' : ')';
  139.             descs[i][3] = ' ';
  140.             get_desc(obj, descs[i]+4);
  141.             if ((n = strlen(descs[i])) > maxlen) {
  142.                 maxlen = n;
  143.             }
  144.         i++;
  145.         }
  146.         obj = obj->next_object;
  147.     }
  148.     (void) strcpy(descs[i++], " --press space to continue--");
  149.     if (maxlen < 27) maxlen = 27;
  150.     col = DCOLS - (maxlen + 2);
  151.  
  152.     for (row = 0; ((row < i) && (row < DROWS)); row++) {
  153.         if (row > 0) {
  154.             for (j = col; j < DCOLS; j++) {
  155.                 descs[row-1][j-col] = mvinch(row, j);
  156.             }
  157.             descs[row-1][j-col] = 0;
  158.         }
  159.         mvaddstr(row, col, descs[row]);
  160.         clrtoeol();
  161.     }
  162.     refresh();
  163.     wait_for_ack();
  164.  
  165.     move(0, 0);
  166.     clrtoeol();
  167.  
  168.     for (j = 1; j < i; j++) {
  169.         mvaddstr(j, col, descs[j-1]);
  170.     }
  171. }
  172.  
  173. mix_colors()
  174. {
  175.     short i, j, k;
  176.     char *t;
  177.  
  178.     for (i = 0; i <= 32; i++) {
  179.         j = get_rand(0, (POTIONS - 1));
  180.         k = get_rand(0, (POTIONS - 1));
  181.         swap_string(id_potions[j].title, id_potions[k].title);
  182.     }
  183. }
  184.  
  185. make_scroll_titles()
  186. {
  187.     short i, j, n;
  188.     short sylls, s;
  189.  
  190.     for (i = 0; i < SCROLLS; i++) {
  191.         sylls = get_rand(2, 5);
  192.         (void) strcpy(id_scrolls[i].title, "'");
  193.  
  194.         for (j = 0; j < sylls; j++) {
  195.             s = get_rand(1, (MAXSYLLABLES-1));
  196.             (void) strcat(id_scrolls[i].title, syllables[s]);
  197.         }
  198.         n = strlen(id_scrolls[i].title);
  199.         (void) strcpy(id_scrolls[i].title+(n-1), "' ");
  200.     }
  201. }
  202.  
  203. get_desc(obj, desc)
  204. object *obj;
  205. char *desc;
  206. {
  207.     char *item_name;
  208.     struct id *id_table;
  209.     char more_info[32];
  210.     short i;
  211.  
  212.     if (obj->what_is == AMULET) {
  213.         (void) strcpy(desc, "the amulet of Yendor ");
  214.         return;
  215.     }
  216.     item_name = name_of(obj);
  217.  
  218.     if (obj->what_is == GOLD) {
  219.         sprintf(desc, "%d pieces of gold", obj->quantity);
  220.         return;
  221.     }
  222.  
  223.     if (obj->what_is != ARMOR) {
  224.         if (obj->quantity == 1) {
  225.             (void) strcpy(desc, "a ");
  226.         } else {
  227.             sprintf(desc, "%d ", obj->quantity);
  228.         }
  229.     }
  230.     if (obj->what_is == FOOD) {
  231.         if (obj->which_kind == RATION) {
  232.             if (obj->quantity > 1) {
  233.                 sprintf(desc, "%d rations of ", obj->quantity);
  234.             } else {
  235.                 (void) strcpy(desc, "some ");
  236.             }
  237.         } else {
  238.             (void) strcpy(desc, "a ");
  239.         }
  240.         (void) strcat(desc, item_name);
  241.         goto ANA;
  242.     }
  243.     id_table = get_id_table(obj);
  244.  
  245.     if (wizard) {
  246.         goto ID;
  247.     }
  248.     if (obj->what_is & (WEAPON | ARMOR | WAND | RING)) {
  249.         goto CHECK;
  250.     }
  251.  
  252.     switch(id_table[obj->which_kind].id_status) {
  253.     case UNIDENTIFIED:
  254. CHECK:
  255.         switch(obj->what_is) {
  256.         case SCROLL:
  257.             (void) strcat(desc, item_name);
  258.             (void) strcat(desc, "entitled: ");
  259.             (void) strcat(desc, id_table[obj->which_kind].title);
  260.             break;
  261.         case POTION:
  262.             (void) strcat(desc, id_table[obj->which_kind].title);
  263.             (void) strcat(desc, item_name);
  264.             break;
  265.         case WAND:
  266.         case RING:
  267.             if (obj->identified ||
  268.             (id_table[obj->which_kind].id_status == IDENTIFIED)) {
  269.                 goto ID;
  270.             }
  271.             if (id_table[obj->which_kind].id_status == CALLED) {
  272.                 goto CALL;
  273.             }
  274.             (void) strcat(desc, id_table[obj->which_kind].title);
  275.             (void) strcat(desc, item_name);
  276.             break;
  277.         case ARMOR:
  278.             if (obj->identified) {
  279.                 goto ID;
  280.             }
  281.             (void) strcpy(desc, id_table[obj->which_kind].title);
  282.             break;
  283.         case WEAPON:
  284.             if (obj->identified) {
  285.                 goto ID;
  286.             }
  287.             (void) strcat(desc, name_of(obj));
  288.             break;
  289.         }
  290.         break;
  291.     case CALLED:
  292. CALL:    switch(obj->what_is) {
  293.         case SCROLL:
  294.         case POTION:
  295.         case WAND:
  296.         case RING:
  297.             (void) strcat(desc, item_name);
  298.             (void) strcat(desc, "called ");
  299.             (void) strcat(desc, id_table[obj->which_kind].title);
  300.             break;
  301.         }
  302.         break;
  303.     case IDENTIFIED:
  304. ID:        switch(obj->what_is) {
  305.         case SCROLL:
  306.         case POTION:
  307.             (void) strcat(desc, item_name);
  308.             (void) strcat(desc, id_table[obj->which_kind].real);
  309.             break;
  310.         case RING:
  311.             if (wizard || obj->identified) {
  312.                 if ((obj->which_kind == DEXTERITY) ||
  313.                     (obj->which_kind == ADD_STRENGTH)) {
  314.                     sprintf(more_info, "%s%d ", ((obj->class > 0) ? "+" : ""),
  315.                         obj->class);
  316.                     (void) strcat(desc, more_info);
  317.                 }
  318.             }
  319.             (void) strcat(desc, item_name);
  320.             (void) strcat(desc, id_table[obj->which_kind].real);
  321.             break;
  322.         case WAND:
  323.             (void) strcat(desc, item_name);
  324.             (void) strcat(desc, id_table[obj->which_kind].real);
  325.             if (wizard || obj->identified) {
  326.                 sprintf(more_info, "[%d]", obj->class);
  327.                 (void) strcat(desc, more_info);
  328.             }
  329.             break;
  330.         case ARMOR:
  331.             sprintf(desc, "%s%d ", ((obj->d_enchant >= 0) ? "+" : ""),
  332.             obj->d_enchant);
  333.             (void) strcat(desc, id_table[obj->which_kind].title);
  334.             sprintf(more_info, "[%d] ", get_armor_class(obj));
  335.             (void) strcat(desc, more_info);
  336.             break;
  337.         case WEAPON:
  338.             sprintf(desc+strlen(desc), "%s%d,%s%d ",
  339.             ((obj->hit_enchant >= 0) ? "+" : ""),
  340.             obj->hit_enchant,
  341.             ((obj->d_enchant >= 0) ? "+" : ""),
  342.             obj->d_enchant);
  343.             (void) strcat(desc, name_of(obj));
  344.             break;
  345.         }
  346.         break;
  347.     }
  348. ANA:
  349.     if (!strncmp(desc, "a ", 2)) {
  350.         if (is_vowel(desc[2])) {
  351.             for (i = strlen(desc) + 1; i > 1; i--) {
  352.                 desc[i] = desc[i-1];
  353.             }
  354.             desc[1] = 'n';
  355.         }
  356.     }
  357.     if (obj->in_use_flags & BEING_WIELDED) {
  358.         (void) strcat(desc, "in hand");
  359.     } else if (obj->in_use_flags & BEING_WORN) {
  360.         (void) strcat(desc, "being worn");
  361.     } else if (obj->in_use_flags & ON_LEFT_HAND) {
  362.         (void) strcat(desc, "on left hand");
  363.     } else if (obj->in_use_flags & ON_RIGHT_HAND) {
  364.         (void) strcat(desc, "on right hand");
  365.     }
  366. }
  367.  
  368. get_wand_and_ring_materials()
  369. {
  370.     short i, j;
  371.     boolean used[WAND_MATERIALS];
  372.  
  373.     for (i = 0; i < WAND_MATERIALS; i++) {
  374.         used[i] = 0;
  375.     }
  376.     for (i = 0; i < WANDS; i++) {
  377.         do {
  378.             j = get_rand(0, WAND_MATERIALS-1);
  379.         } while (used[j]);
  380.         used[j] = 1;
  381.         (void) strcpy(id_wands[i].title, wand_materials[j]);
  382.         is_wood[i] = (j > MAX_METAL);
  383.     }
  384.     for (i = 0; i < GEMS; i++) {
  385.         used[i] = 0;
  386.     }
  387.     for (i = 0; i < RINGS; i++) {
  388.         do {
  389.             j = get_rand(0, GEMS-1);
  390.         } while (used[j]);
  391.         used[j] = 1;
  392.         (void) strcpy(id_rings[i].title, gems[j]);
  393.     }
  394. }
  395.  
  396. single_inv(ichar)
  397. short ichar;
  398. {
  399.     short ch;
  400.     char desc[DCOLS];
  401.     object *obj;
  402.  
  403.     ch = ichar ? ichar : pack_letter("inventory what?", ALL_OBJECTS);
  404.  
  405.     if (ch == CANCEL) {
  406.         return;
  407.     }
  408.     if (!(obj = get_letter_object(ch))) {
  409.         message("no such item.", 0);
  410.         return;
  411.     }
  412.     desc[0] = ch;
  413.     desc[1] = ((obj->what_is & ARMOR) && obj->is_protected) ? '}' : ')';
  414.     desc[2] = ' ';
  415.     desc[3] = 0;
  416.     get_desc(obj, desc+3);
  417.     message(desc, 0);
  418. }
  419.  
  420. struct id *
  421. get_id_table(obj)
  422. object *obj;
  423. {
  424.     switch(obj->what_is) {
  425.     case SCROLL:
  426.         return(id_scrolls);
  427.     case POTION:
  428.         return(id_potions);
  429.     case WAND:
  430.         return(id_wands);
  431.     case RING:
  432.         return(id_rings);
  433.     case WEAPON:
  434.         return(id_weapons);
  435.     case ARMOR:
  436.         return(id_armors);
  437.     }
  438.     return((struct id *) 0);
  439. }
  440.  
  441. inv_armor_weapon(is_weapon)
  442. boolean is_weapon;
  443. {
  444.     if (is_weapon) {
  445.         if (rogue.weapon) {
  446.             single_inv(rogue.weapon->ichar);
  447.         } else {
  448.             message("not wielding anything", 0);
  449.         }
  450.     } else {
  451.         if (rogue.armor) {
  452.             single_inv(rogue.armor->ichar);
  453.         } else {
  454.             message("not wearing anything", 0);
  455.         }
  456.     }
  457. }
  458.